home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2002 November / SGI IRIX 6.5 Applications 2002 November.iso / dev / java2v131_02_dev.idb / usr / java2v131_02 / include / jvmdi.h.z / jvmdi.h
Encoding:
C/C++ Source or Header  |  2002-06-19  |  36.3 KB  |  970 lines

  1. /*
  2.  * @(#)jvmdi.h    1.41 00/02/02
  3.  *
  4.  * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the proprietary information of Sun Microsystems, Inc.  
  7.  * Use is subject to license terms.
  8.  * 
  9.  */
  10.  
  11. /*
  12.  *   Java Virtual Machine Debug Interface
  13.  *
  14.  *   Defines debugging functionality that a VM should provide.  
  15.  *
  16.  *   Should not overlap functionality in jni.h
  17.  */
  18.  
  19. #ifndef _JAVASOFT_JVMDI_H_
  20. #define _JAVASOFT_JVMDI_H_
  21.  
  22. #include "jni.h"
  23.  
  24. #define JVMDI_VERSION_1 0x20010000
  25.  
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29.  
  30. typedef jobject jthread;
  31.  
  32. typedef jobject jthreadGroup;
  33.  
  34. struct _jframeID;
  35. typedef struct _jframeID *jframeID;
  36.  
  37.   /* specifies program location "pc" - often byte code index */
  38. typedef jlong jlocation;
  39.  
  40.   /*
  41.    *  Errors
  42.    */
  43.  
  44. typedef jint jvmdiError;
  45.  
  46.   /* no error */
  47. #define JVMDI_ERROR_NONE                 ((jvmdiError)0)
  48.  
  49.   /*
  50.    * Errors on thread operations
  51.    */
  52.  
  53.   /* invalid thread */
  54. #define JVMDI_ERROR_INVALID_THREAD       ((jvmdiError)10)
  55.   /* invalid thread group */
  56. #define JVMDI_ERROR_INVALID_THREAD_GROUP ((jvmdiError)11)
  57.   /* invalid thread priority */
  58. #define JVMDI_ERROR_INVALID_PRIORITY     ((jvmdiError)12)
  59.   /* thread not suspended */
  60. #define JVMDI_ERROR_THREAD_NOT_SUSPENDED ((jvmdiError)13)
  61.   /* thread already suspended */
  62. #define JVMDI_ERROR_THREAD_SUSPENDED     ((jvmdiError)14)
  63.  
  64.   /* 
  65.    * Errors on object and class operations
  66.    */
  67.  
  68.   /* invalid object (implementation not required to gracefully catch) */
  69. #define JVMDI_ERROR_INVALID_OBJECT       ((jvmdiError)20)
  70.   /* invalid class (implementation not required to gracefully catch) */
  71. #define JVMDI_ERROR_INVALID_CLASS        ((jvmdiError)21)
  72.   /* class not prepared */
  73. #define JVMDI_ERROR_CLASS_NOT_PREPARED   ((jvmdiError)22)
  74.   /* invalid methodID (implementation not required to gracefully catch) */
  75. #define JVMDI_ERROR_INVALID_METHODID     ((jvmdiError)23)
  76.   /* invalid location */
  77. #define JVMDI_ERROR_INVALID_LOCATION     ((jvmdiError)24)
  78.   /* invalid fieldID (implementation not required to gracefully catch) */
  79. #define JVMDI_ERROR_INVALID_FIELDID      ((jvmdiError)25)
  80.  
  81.   /*
  82.    * Errors on frame operations
  83.    */
  84.  
  85.   /* invalid frameID (implementation not required to gracefully catch) */
  86. #define JVMDI_ERROR_INVALID_FRAMEID      ((jvmdiError)30)
  87.   /* there are no more frames on the stack */
  88. #define JVMDI_ERROR_NO_MORE_FRAMES       ((jvmdiError)31)
  89.   /* operation cannot be performed on this frame */
  90. #define JVMDI_ERROR_OPAQUE_FRAME         ((jvmdiError)32)
  91.   /* operation can only be performed on current frame */
  92. #define JVMDI_ERROR_NOT_CURRENT_FRAME    ((jvmdiError)33)
  93.   /* type mismatch (implementation not required to gracefully catch) */
  94. #define JVMDI_ERROR_TYPE_MISMATCH        ((jvmdiError)34)
  95.   /* invalid slot */
  96. #define JVMDI_ERROR_INVALID_SLOT         ((jvmdiError)35)
  97.  
  98.   /*
  99.    * Errors on set/clear/find operations
  100.    */
  101.  
  102.   /* item already present */
  103. #define JVMDI_ERROR_DUPLICATE            ((jvmdiError)40)
  104.   /* item not found */
  105. #define JVMDI_ERROR_NOT_FOUND            ((jvmdiError)41)
  106.  
  107.   /*
  108.    * Errors on monitor operations
  109.    */
  110.  
  111.   /* invalid monitor */
  112. #define JVMDI_ERROR_INVALID_MONITOR      ((jvmdiError)50)
  113.   /* wait, notify, notify all tried without entering monitor  */
  114. #define JVMDI_ERROR_NOT_MONITOR_OWNER    ((jvmdiError)51)
  115.   /* waiting thread interrupted */
  116. #define JVMDI_ERROR_INTERRUPT            ((jvmdiError)52)
  117.   
  118.   /*
  119.    * Class redefinition / operand stack errors
  120.    */
  121.  
  122.   /* The equivalent of ClassFormatError */
  123. #define JVMDI_ERROR_INVALID_CLASS_FORMAT          ((jvmdiError)60)
  124.   /* The equivalent of ClassCircularityError */
  125. #define JVMDI_ERROR_CIRCULAR_CLASS_DEFINITION     ((jvmdiError)61)
  126.   /* The class bytes fail verification */
  127. #define JVMDI_ERROR_FAILS_VERIFICATION            ((jvmdiError)62)
  128.   /* Cannot add new methods to an existing class */
  129. #define JVMDI_ERROR_ADD_METHOD_NOT_IMPLEMENTED    ((jvmdiError)63)
  130.   /* Cannot change fields of an existing class */
  131. #define JVMDI_ERROR_SCHEMA_CHANGE_NOT_IMPLEMENTED ((jvmdiError)64)
  132.   /* bci/operand stack/local var combination is not verifiably type safe */
  133. #define JVMDI_ERROR_INVALID_TYPESTATE             ((jvmdiError)65)
  134.  
  135.   /*
  136.    * Miscellaneous errors
  137.    */
  138.  
  139.   /* Not yet implemented */
  140. #define JVMDI_ERROR_NOT_IMPLEMENTED      ((jvmdiError)99)
  141.   /* null pointer */
  142. #define JVMDI_ERROR_NULL_POINTER         ((jvmdiError)100)
  143.   /* information is absent */
  144. #define JVMDI_ERROR_ABSENT_INFORMATION   ((jvmdiError)101)
  145.   /* invalid event type  */
  146. #define JVMDI_ERROR_INVALID_EVENT_TYPE   ((jvmdiError)102)
  147.   /* invalid argument  */
  148. #define JVMDI_ERROR_ILLEGAL_ARGUMENT     ((jvmdiError)103)
  149.  
  150.   /*
  151.    * Universal errors. These errors may be returned by
  152.    * any JVMDI function, not just the ones for which they are listed
  153.    * below.
  154.    */
  155.  
  156.   /* no more memory available for allocation */
  157. #define JVMDI_ERROR_OUT_OF_MEMORY        ((jvmdiError)110)
  158.   /* debugging has not been enabled in this VM */
  159. #define JVMDI_ERROR_ACCESS_DENIED        ((jvmdiError)111)
  160.   /* VM is dead (implementation not required to gracefully catch) */
  161. #define JVMDI_ERROR_VM_DEAD              ((jvmdiError)112)
  162.   /* internal error  */
  163. #define JVMDI_ERROR_INTERNAL             ((jvmdiError)113)
  164.   /* Thread calling JVMDI function not attached to VM */
  165. #define JVMDI_ERROR_UNATTACHED_THREAD    ((jvmdiError)115)
  166.  
  167.  
  168.   /*
  169.    *  Threads
  170.    */
  171.  
  172.   /* Thread status is unknown */
  173. #define JVMDI_THREAD_STATUS_UNKNOWN      ((jint)-1)
  174.   /* Thread is waiting to die */
  175. #define JVMDI_THREAD_STATUS_ZOMBIE       ((jint)0)
  176.   /* Thread is runnable */
  177. #define JVMDI_THREAD_STATUS_RUNNING      ((jint)1)
  178.   /* Thread is sleeping - Thread.sleep() or JVM_Sleep() was called */
  179. #define JVMDI_THREAD_STATUS_SLEEPING     ((jint)2)
  180.   /* Thread is waiting on a java monitor */
  181. #define JVMDI_THREAD_STATUS_MONITOR      ((jint)3)
  182.   /* Thread is waiting - Thread.wait() or JVM_MonitorWait() was called */
  183. #define JVMDI_THREAD_STATUS_WAIT         ((jint)4)
  184.  
  185.   /* Thread is suspended - Thread.suspend(), JVM_Suspend() or
  186.    * JVMDI_Suspend was called */
  187. #define JVMDI_SUSPEND_STATUS_SUSPENDED   ((jint)0x1)
  188.   /* Thread is at a breakpoint */
  189. #define JVMDI_SUSPEND_STATUS_BREAK       ((jint)0x2)
  190.  
  191.  
  192.   /* Thread priority constants */
  193. #define JVMDI_THREAD_MIN_PRIORITY   ((jint)1)
  194. #define JVMDI_THREAD_NORM_PRIORITY  ((jint)5)
  195. #define JVMDI_THREAD_MAX_PRIORITY   ((jint)10)
  196.  
  197. typedef struct {
  198.     char *name;
  199.     jint  priority;
  200.     jboolean is_daemon;
  201.     jthreadGroup thread_group;
  202.     jobject context_class_loader;
  203. } JVMDI_thread_info;
  204.  
  205. typedef struct {
  206.     jthreadGroup parent;
  207.     char *name;
  208.     jint  max_priority;
  209.     jboolean is_daemon;
  210. } JVMDI_thread_group_info;
  211.  
  212. #define JVMDI_DISABLE ((jint) 0)
  213. #define JVMDI_ENABLE  ((jint) 1)
  214.  
  215. /*
  216.  * Initial function for debug threads created through JVMDI
  217.  */
  218. typedef void (*JVMDI_StartFunction)(void *);
  219.  
  220. /*
  221.  * Type for debug monitors created through JVMDI
  222.  */
  223. typedef void *JVMDI_RawMonitor;
  224.  
  225. #define JVMDI_MONITOR_WAIT_FOREVER ((jlong)(-1))
  226.  
  227. /*
  228.  * Monitor information
  229.  */
  230. typedef struct {
  231.     jthread owner;
  232.     jint entry_count;
  233.     jint waiter_count;
  234.     jthread *waiters;
  235. } JVMDI_monitor_info;
  236.  
  237. typedef struct {
  238.     jint owned_monitor_count;
  239.     jobject *owned_monitors;
  240. } JVMDI_owned_monitor_info;
  241.  
  242.   /*
  243.    *  Events
  244.    */
  245.  
  246.     /* kind = JVMDI_EVENT_SINGLE_STEP */
  247.     typedef struct { 
  248.         jthread thread;
  249.         jclass clazz;
  250.         jmethodID method;
  251.         jlocation location;
  252.     } JVMDI_single_step_event_data;
  253.             
  254.     /* kind = JVMDI_EVENT_BREAKPOINT */
  255.     typedef struct { 
  256.         jthread thread;
  257.         jclass clazz;
  258.         jmethodID method;
  259.         jlocation location;
  260.     } JVMDI_breakpoint_event_data;
  261.     
  262.     /* kind = JVMDI_EVENT_FIELD_ACCESS */
  263.     typedef struct { 
  264.         jthread thread;
  265.         jclass clazz;
  266.         jmethodID method;
  267.         jlocation location;
  268.         jclass field_clazz;
  269.         jobject object;
  270.         jfieldID field;
  271.     } JVMDI_field_access_event_data;
  272.     
  273.     /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
  274.     typedef struct { 
  275.         jthread thread;
  276.         jclass clazz;
  277.         jmethodID method;
  278.         jlocation location;
  279.         jclass field_clazz;
  280.         jobject object;
  281.         jfieldID field;
  282.         char signature_type;
  283.         jvalue new_value;
  284.     } JVMDI_field_modification_event_data;
  285.     
  286.     /* kind = JVMDI_EVENT_FRAME_POP */
  287.     /* kind = JVMDI_EVENT_METHOD_ENTRY */
  288.     /* kind = JVMDI_EVENT_METHOD_EXIT */
  289.     typedef struct { 
  290.         jthread thread;
  291.         jclass clazz;
  292.         jmethodID method;
  293.         jframeID frame;
  294.     } JVMDI_frame_event_data;
  295.     
  296.     /* kind = JVMDI_EVENT_EXCEPTION */
  297.     typedef struct { 
  298.         jthread thread;
  299.         jclass clazz;
  300.         jmethodID method;
  301.         jlocation location;
  302.         jobject exception;
  303.         jclass catch_clazz;
  304.         jmethodID catch_method;
  305.         jlocation catch_location;
  306.     } JVMDI_exception_event_data;
  307.     
  308.     /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
  309.     typedef struct { 
  310.         jthread thread;
  311.         jclass clazz;
  312.         jmethodID method;
  313.         jlocation location;
  314.         jobject exception;
  315.     } JVMDI_exception_catch_event_data;
  316.     
  317.     /* kind = JVMDI_EVENT_USER_DEFINED */
  318.     typedef struct { 
  319.         jobject object;
  320.         jint key;
  321.     } JVMDI_user_event_data;
  322.     
  323.     /* kind = JVMDI_EVENT_THREAD_END or */
  324.     /* JVMDI_EVENT_THREAD_START */
  325.     typedef struct { 
  326.         jthread thread;
  327.     } JVMDI_thread_change_event_data;
  328.     
  329.     /* kind = JVMDI_EVENT_CLASS_LOAD, */
  330.     /* JVMDI_EVENT_CLASS_UNLOAD, or */
  331.     /* JVMDI_EVENT_CLASS_PREPARE */
  332.     typedef struct { 
  333.         jthread thread;
  334.         jclass clazz;
  335.     } JVMDI_class_event_data;
  336.     
  337. /* This stucture passes information about the event.
  338.  * location is the index of the last instruction executed. 
  339.  */
  340. typedef struct {
  341.     jint kind;        /* the discriminant */
  342.  
  343.     union {
  344.     /* kind = JVMDI_EVENT_SINGLE_STEP */
  345.         JVMDI_single_step_event_data single_step;
  346.             
  347.         /* kind = JVMDI_EVENT_BREAKPOINT */
  348.         JVMDI_breakpoint_event_data breakpoint;
  349.  
  350.         /* kind = JVMDI_EVENT_FRAME_POP */
  351.         /* kind = JVMDI_EVENT_METHOD_ENTRY */
  352.         /* kind = JVMDI_EVENT_METHOD_EXIT */
  353.         JVMDI_frame_event_data frame;
  354.  
  355.         /* kind = JVMDI_EVENT_FIELD_ACCESS */
  356.         JVMDI_field_access_event_data field_access;
  357.  
  358.         /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
  359.         JVMDI_field_modification_event_data field_modification;
  360.  
  361.         /* kind = JVMDI_EVENT_EXCEPTION */
  362.         JVMDI_exception_event_data exception;
  363.  
  364.         /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
  365.         JVMDI_exception_catch_event_data exception_catch;
  366.  
  367.         /* kind = JVMDI_EVENT_USER_DEFINED */
  368.         JVMDI_user_event_data user;
  369.             
  370.         /* kind = JVMDI_EVENT_THREAD_END or */
  371.         /* JVMDI_EVENT_THREAD_START */
  372.         JVMDI_thread_change_event_data thread_change;
  373.             
  374.         /* kind = JVMDI_EVENT_CLASS_LOAD, */
  375.         /* JVMDI_EVENT_CLASS_UNLOAD, or */
  376.         /* JVMDI_EVENT_CLASS_PREPARE */
  377.         JVMDI_class_event_data class_event;
  378.             
  379.         /* kind = JVMDI_EVENT_VM_DEATH, JVMDI_EVENT_VM_INIT */
  380.         /* no additional fields */        
  381.     } u;
  382. } JVMDI_Event;
  383.  
  384.     /*** event kinds ***/
  385. #define JVMDI_EVENT_SINGLE_STEP   ((jint)1)
  386. #define JVMDI_EVENT_BREAKPOINT    ((jint)2)
  387. #define JVMDI_EVENT_FRAME_POP     ((jint)3)
  388. #define JVMDI_EVENT_EXCEPTION     ((jint)4)
  389. #define JVMDI_EVENT_USER_DEFINED  ((jint)5)
  390. #define JVMDI_EVENT_THREAD_START  ((jint)6)
  391. #define JVMDI_EVENT_THREAD_END    ((jint)7)
  392. #define JVMDI_EVENT_CLASS_PREPARE ((jint)8)
  393. #define JVMDI_EVENT_CLASS_UNLOAD  ((jint)9)
  394. #define JVMDI_EVENT_CLASS_LOAD    ((jint)10)
  395. #define JVMDI_EVENT_FIELD_ACCESS       ((jint)20)
  396. #define JVMDI_EVENT_FIELD_MODIFICATION ((jint)21)
  397. #define JVMDI_EVENT_EXCEPTION_CATCH    ((jint)30)
  398. #define JVMDI_EVENT_METHOD_ENTRY       ((jint)40)
  399. #define JVMDI_EVENT_METHOD_EXIT        ((jint)41)
  400. #define JVMDI_EVENT_VM_INIT            ((jint)90)
  401. #define JVMDI_EVENT_VM_DEATH           ((jint)99)
  402.  
  403. #define JVMDI_MAX_EVENT_TYPE_VAL       ((jint)99)
  404.  
  405.  
  406.  
  407. /* event handler hook */
  408. typedef void (*JVMDI_EventHook)(JNIEnv *env, JVMDI_Event *event);
  409.  
  410. typedef jvmdiError (*JVMDI_AllocHook) (jlong size, jbyte** memPtr);
  411. typedef jvmdiError (*JVMDI_DeallocHook) (jbyte* buffer);
  412.  
  413. /*
  414.  * Class states used in JVMDI_GetClassStatus
  415.  */
  416. #define JVMDI_CLASS_STATUS_VERIFIED          ((jint)0x01)
  417. #define JVMDI_CLASS_STATUS_PREPARED          ((jint)0x02)
  418. #define JVMDI_CLASS_STATUS_INITIALIZED       ((jint)0x04)
  419.  /* Error prevents initialization */
  420. #define JVMDI_CLASS_STATUS_ERROR             ((jint)0x08) 
  421.  
  422. /* structure for returning line number information 
  423.  */
  424. typedef struct {
  425.     jlocation start_location;
  426.     jint line_number;
  427. } JVMDI_line_number_entry;
  428.  
  429.  
  430. /* structure for returning local variable information 
  431.  */
  432. typedef struct {
  433.     jlocation start_location;   /* variable valid start_location */
  434.     jint length;                /* upto start_location+length */ 
  435.     char *name;                 /* name in UTF8 */
  436.     char *signature;            /* type signature in UTF8 */
  437.     jint slot;                  /* variable slot, see JVMDI_GetLocal*()  */
  438. } JVMDI_local_variable_entry;
  439.  
  440. /* structure for returning exception handler information 
  441.  */
  442. typedef struct {
  443.     jlocation start_location;
  444.     jlocation end_location;
  445.     jlocation handler_location;
  446.     jclass exception;           /* if null, all exceptions */
  447. } JVMDI_exception_handler_entry;
  448.  
  449. #define JVMDI_OPERAND_TYPE_REFERENCE      ((jint)1)
  450. #define JVMDI_OPERAND_TYPE_INT            ((jint)2)
  451. #define JVMDI_OPERAND_TYPE_FLOAT          ((jint)3)
  452. #define JVMDI_OPERAND_TYPE_LONG0          ((jint)4) /* least sig. 32 bits */
  453. #define JVMDI_OPERAND_TYPE_LONG1          ((jint)5) /* most sig. 32 bits */
  454. #define JVMDI_OPERAND_TYPE_DOUBLE0        ((jint)6) /* least sig. 32 bits */
  455. #define JVMDI_OPERAND_TYPE_DOUBLE1        ((jint)7) /* most sig. 32 bits */
  456. #define JVMDI_OPERAND_TYPE_RETURN_ADDRESS ((jint)8)
  457.  
  458. typedef struct {
  459.     jint word;                 /* 32 bit operand stack quantities */
  460.     jint type;                 /* type encoding of the operand word */
  461.                                /* one of JVMDI_OPERAND_TYPE_* */
  462. } JVMDI_operand_stack_element;
  463.  
  464. typedef struct { 
  465.     jint instance_field_count; /* number of instance fields referencing obj */
  466.     struct JVMDI_instance_field {
  467.         jobject instance;      /* instance referencing obj */
  468.         jfieldID field;        /* field holding reference */
  469.     } *instance_fields;        /* instanceField_count of them */
  470.      
  471.     jint static_field_count;   /* number of static fields referencing obj */
  472.     struct JVMDI_static_field {
  473.         jclass clazz;          /* class referencing obj */
  474.         jfieldID static_field; /* field holding reference */
  475.     } *static_fields;          /* static_field_count of them */
  476.     
  477.     jint array_element_count;  /* number of array elements referencing obj */
  478.     struct JVMDI_array_element {
  479.         jobjectArray array;    /* array referencing obj */
  480.         jint index;            /* index holding reference */
  481.     } *array_elements;         /* array_element_count of them */
  482.     
  483.     jint frame_slot_count;     /* number of frame slots referencing obj */
  484.     struct JVMDI_frame_slot {
  485.         jthread thread;        /* thread of the frame */
  486.         jframeID frame;        /* frame referencing obj */
  487.         jint slot;             /* slot holding reference */
  488.     } *frame_slots;            /* frame_slot_count of them */
  489. } JVMDI_object_reference_info;
  490.  
  491. /* structure for defining a class
  492. */
  493. typedef struct {
  494.     jclass clazz;              /* Class object for this class */
  495.     jint class_byte_count;     /* number of bytes defining class (below) */
  496.     jbyte *class_bytes;        /* bytes defining class (in JVM spec */
  497.                                /* Class File Format) */
  498. } JVMDI_class_definition;
  499.  
  500.  
  501. typedef struct {
  502.     unsigned int can_watch_field_modification      : 1;
  503.     unsigned int can_watch_field_access            : 1;
  504.     unsigned int can_get_bytecodes                 : 1;
  505.     unsigned int can_get_synthetic_attribute       : 1;
  506.     unsigned int can_get_owned_monitor_info        : 1;
  507.     unsigned int can_get_current_contended_monitor : 1;
  508.     unsigned int can_get_monitor_info              : 1;
  509.     unsigned int can_get_heap_info                 : 1;
  510.     unsigned int can_get_operand_stack             : 1;
  511.     unsigned int can_set_operand_stack             : 1;
  512.     unsigned int can_pop_frame                     : 1;
  513.     unsigned int can_get_class_definition          : 1;
  514.     unsigned int can_redefine_classes              : 1; 
  515.     unsigned int can_add_method                    : 1;
  516.     unsigned int can_change_schema                 : 1;
  517. } JVMDI_capabilities;
  518.  
  519. typedef struct JVMDI_Interface_1_ {
  520.     jvmdiError (JNICALL *SetEventHook)
  521.       (JVMDI_EventHook hook);
  522.     jvmdiError (JNICALL *SetEventNotificationMode)
  523.       (jint mode, jint eventType, jthread thread, ...);
  524.  
  525.     jvmdiError (JNICALL *GetThreadStatus)
  526.       (jthread thread,
  527.        jint *threadStatusPtr, jint *suspendStatusPtr);
  528.     jvmdiError (JNICALL *GetAllThreads)
  529.       (jint *threadsCountPtr, jthread **threadsPtr);
  530.     jvmdiError (JNICALL *SuspendThread)
  531.       (jthread thread); 
  532.     jvmdiError (JNICALL *ResumeThread)
  533.       (jthread thread);
  534.     jvmdiError (JNICALL *StopThread)
  535.       (jthread thread, jobject exception);
  536.     jvmdiError (JNICALL *InterruptThread)
  537.       (jthread thread);
  538.     jvmdiError (JNICALL *GetThreadInfo)
  539.       (jthread thread, JVMDI_thread_info *infoPtr);
  540.     jvmdiError (JNICALL *GetOwnedMonitorInfo)
  541.       (jthread thread, JVMDI_owned_monitor_info *infoPtr);
  542.     jvmdiError (JNICALL *GetCurrentContendedMonitor)
  543.       (jthread thread, jobject *monitor);
  544.     jvmdiError (JNICALL *RunDebugThread)
  545.       (jthread thread, JVMDI_StartFunction proc, void *arg,
  546.        int priority);
  547.  
  548.     jvmdiError (JNICALL *GetTopThreadGroups)
  549.       (jint *groupCountPtr, jthreadGroup **groupsPtr);
  550.     jvmdiError (JNICALL *GetThreadGroupInfo)
  551.       (jthreadGroup group, JVMDI_thread_group_info *infoPtr);
  552.     jvmdiError (JNICALL *GetThreadGroupChildren)
  553.       (jthreadGroup group, 
  554.        jint *threadCountPtr, jthread **threadsPtr,
  555.        jint *groupCountPtr, jthreadGroup **groupsPtr);
  556.  
  557.     jvmdiError (JNICALL *GetFrameCount)
  558.       (jthread thread, jint *countPtr);
  559.     jvmdiError (JNICALL *GetCurrentFrame)
  560.       (jthread thread, jframeID *framePtr);
  561.     jvmdiError (JNICALL *GetCallerFrame)
  562.       (jframeID called, jframeID *framePtr);
  563.     jvmdiError (JNICALL *GetFrameLocation)
  564.       (jframeID frame, jclass *classPtr, jmethodID *methodPtr,
  565.        jlocation *locationPtr);
  566.     jvmdiError (JNICALL *NotifyFramePop)
  567.       (jframeID frame); 
  568.     jvmdiError (JNICALL *GetLocalObject)
  569.       (jframeID frame, jint slot, jobject *valuePtr);
  570.     jvmdiError (JNICALL *GetLocalInt)
  571.       (jframeID frame, jint slot, jint *valuePtr);
  572.     jvmdiError (JNICALL *GetLocalLong)
  573.       (jframeID frame, jint slot, jlong *valuePtr);
  574.     jvmdiError (JNICALL *GetLocalFloat)
  575.       (jframeID frame, jint slot, jfloat *valuePtr);
  576.     jvmdiError (JNICALL *GetLocalDouble)
  577.       (jframeID frame, jint slot, jdouble *valuePtr);
  578.     jvmdiError (JNICALL *SetLocalObject)
  579.       (jframeID frame, jint slot, jobject value);
  580.     jvmdiError (JNICALL *SetLocalInt)
  581.       (jframeID frame, jint slot, jint value);
  582.     jvmdiError (JNICALL *SetLocalLong)
  583.       (jframeID frame, jint slot, jlong value);
  584.     jvmdiError (JNICALL *SetLocalFloat)
  585.       (jframeID frame, jint slot, jfloat value);
  586.     jvmdiError (JNICALL *SetLocalDouble)
  587.       (jframeID frame, jint slot, jdouble value);
  588.  
  589.     jvmdiError (JNICALL *CreateRawMonitor)
  590.       (char *name, JVMDI_RawMonitor *monitorPtr);
  591.     jvmdiError (JNICALL *DestroyRawMonitor)
  592.       (JVMDI_RawMonitor monitor);
  593.     jvmdiError (JNICALL *RawMonitorEnter)
  594.       (JVMDI_RawMonitor monitor);
  595.     jvmdiError (JNICALL *RawMonitorExit)
  596.       (JVMDI_RawMonitor monitor);
  597.     jvmdiError (JNICALL *RawMonitorWait)
  598.       (JVMDI_RawMonitor monitor, jlong millis);
  599.     jvmdiError (JNICALL *RawMonitorNotify)
  600.       (JVMDI_RawMonitor monitor);
  601.     jvmdiError (JNICALL *RawMonitorNotifyAll)
  602.       (JVMDI_RawMonitor monitor);
  603.  
  604.     jvmdiError (JNICALL *SetBreakpoint)
  605.       (jclass clazz, jmethodID method, jlocation location);
  606.     jvmdiError (JNICALL *ClearBreakpoint)
  607.       (jclass clazz, jmethodID method, jlocation location);
  608.     jvmdiError (JNICALL *ClearAllBreakpoints)
  609.       ();
  610.  
  611.     jvmdiError (JNICALL *SetFieldAccessWatch)
  612.       (jclass clazz, jfieldID field);
  613.     jvmdiError (JNICALL *ClearFieldAccessWatch)
  614.       (jclass clazz, jfieldID field);
  615.     jvmdiError (JNICALL *SetFieldModificationWatch)
  616.       (jclass clazz, jfieldID field);
  617.     jvmdiError (JNICALL *ClearFieldModificationWatch)
  618.       (jclass clazz, jfieldID field);
  619.  
  620.     jvmdiError (JNICALL *SetAllocationHooks)
  621.       (JVMDI_AllocHook ahook, JVMDI_DeallocHook dhook);
  622.     jvmdiError (JNICALL *Allocate)
  623.       (jlong size, jbyte** memPtr);
  624.     jvmdiError (JNICALL *Deallocate)
  625.       (jbyte* mem);
  626.  
  627.     jvmdiError (JNICALL *GetClassSignature)
  628.       (jclass clazz, char **sigPtr);
  629.     jvmdiError (JNICALL *GetClassStatus)
  630.       (jclass clazz, jint *statusPtr);
  631.     jvmdiError (JNICALL *GetSourceFileName)
  632.       (jclass clazz, char **sourceNamePtr);
  633.     jvmdiError (JNICALL *GetClassModifiers)
  634.       (jclass clazz, jint *modifiersPtr);
  635.     jvmdiError (JNICALL *GetClassMethods)
  636.       (jclass clazz, jint *methodCountPtr, jmethodID **methodsPtr);
  637.     jvmdiError (JNICALL *GetClassFields)
  638.        (jclass clazz, jint *fieldCountPtr, jfieldID **fieldsPtr);
  639.     jvmdiError (JNICALL *GetImplementedInterfaces)
  640.       (jclass clazz, jint *interfaceCountPtr, jclass **interfacesPtr);
  641.     jvmdiError (JNICALL *IsInterface)
  642.       (jclass clazz, jboolean *isInterfacePtr);
  643.     jvmdiError (JNICALL *IsArrayClass)
  644.       (jclass clazz, jboolean *isArrayClassPtr);
  645.     jvmdiError (JNICALL *GetClassLoader)
  646.       (jclass clazz, jobject *classloaderPtr);
  647.  
  648.     jvmdiError (JNICALL *GetObjectHashCode)
  649.       (jobject object, jint *hashCodePtr);
  650.     jvmdiError (JNICALL *GetMonitorInfo)
  651.       (jobject object, JVMDI_monitor_info *infoPtr);
  652.  
  653.     jvmdiError (JNICALL *GetFieldName)
  654.       (jclass clazz, jfieldID field, char **namePtr, char **signaturePtr);
  655.     jvmdiError (JNICALL *GetFieldDeclaringClass)
  656.       (jclass clazz, jfieldID field, jclass *declaringClassPtr);
  657.     jvmdiError (JNICALL *GetFieldModifiers)
  658.       (jclass clazz, jfieldID field, jint *modifiersPtr);
  659.     jvmdiError (JNICALL *IsFieldSynthetic)
  660.       (jclass clazz, jfieldID field, jboolean *isSyntheticPtr);
  661.  
  662.     jvmdiError (JNICALL *GetMethodName)
  663.       (jclass clazz, jmethodID method, 
  664.        char **namePtr, char **signaturePtr);
  665.     jvmdiError (JNICALL *GetMethodDeclaringClass)
  666.       (jclass clazz, jmethodID method, jclass *declaringClassPtr);
  667.     jvmdiError (JNICALL *GetMethodModifiers)
  668.       (jclass clazz, jmethodID method, jint *modifiersPtr);
  669.     jvmdiError (JNICALL *GetMaxStack)
  670.       (jclass clazz, jmethodID method, jint *maxPtr);
  671.     jvmdiError (JNICALL *GetMaxLocals)
  672.       (jclass clazz, jmethodID method, jint *maxPtr);
  673.     jvmdiError (JNICALL *GetArgumentsSize)
  674.       (jclass clazz, jmethodID method, jint *sizePtr);
  675.     jvmdiError (JNICALL *GetLineNumberTable)
  676.       (jclass clazz, jmethodID method,
  677.        jint *entryCountPtr, JVMDI_line_number_entry **tablePtr);
  678.     jvmdiError (JNICALL *GetMethodLocation)
  679.       (jclass clazz, jmethodID method,
  680.        jlocation *startLocationPtr, jlocation *endLocationPtr);
  681.     jvmdiError (JNICALL *GetLocalVariableTable)
  682.       (jclass clazz, jmethodID method,
  683.        jint *entryCountPtr, JVMDI_local_variable_entry **tablePtr);
  684.     jvmdiError (JNICALL *GetExceptionHandlerTable)
  685.       (jclass clazz, jmethodID method,
  686.        jint *entryCountPtr, JVMDI_exception_handler_entry **tablePtr);
  687.     jvmdiError (JNICALL *GetThrownExceptions)
  688.       (jclass clazz, jmethodID method,
  689.        jint *exceptionCountPtr, jclass **exceptionsPtr);
  690.     jvmdiError (JNICALL *GetBytecodes)
  691.       (jclass clazz, jmethodID method,
  692.        jint *bytecodeCountPtr, jbyte **bytecodesPtr);
  693.     jvmdiError (JNICALL *IsMethodNative)
  694.       (jclass clazz, jmethodID method, jboolean *isNativePtr);
  695.     jvmdiError (JNICALL *IsMethodSynthetic)
  696.       (jclass clazz, jmethodID method, jboolean *isSyntheticPtr);
  697.  
  698.     jvmdiError (JNICALL *GetLoadedClasses)
  699.       (jint *classCountPtr, jclass **classesPtr);
  700.     jvmdiError (JNICALL *GetClassLoaderClasses)
  701.       (jobject initiatingLoader, jint *classesCountPtr, 
  702.        jclass **classesPtr);
  703.  
  704.     jvmdiError (JNICALL *PopFrame)
  705.       (jthread thread);
  706.     jvmdiError (JNICALL *SetFrameLocation)
  707.       (jframeID frame, jlocation location);
  708.     jvmdiError (JNICALL *GetOperandStack)
  709.       (jframeID frame, jint *operandStackSizePtr, 
  710.        JVMDI_operand_stack_element **operandStackPtr);
  711.     jvmdiError (JNICALL *SetOperandStack)
  712.       (jframeID frame, jint operandStackSize, 
  713.        JVMDI_operand_stack_element *operandStack);
  714.     jvmdiError (JNICALL *AllInstances)
  715.       (jclass clazz, jint *instanceCountPtr, jobject **instancesPtr);
  716.     jvmdiError (JNICALL *References)
  717.       (jobject obj, JVMDI_object_reference_info *refs);
  718.     jvmdiError (JNICALL *GetClassDefinition)
  719.       (jclass clazz, JVMDI_class_definition *classDefPtr);
  720.     jvmdiError (JNICALL *RedefineClasses)
  721.       (jint classCount, JVMDI_class_definition *classDefs);
  722.  
  723.     jvmdiError (JNICALL *GetVersionNumber)
  724.       (jint *versionPtr);
  725.     jvmdiError (JNICALL *GetCapabilities)
  726.       (JVMDI_capabilities *capabilitiesPtr);
  727. } JVMDI_Interface_1;
  728.   
  729. #ifndef NO_JVMDI_MACROS
  730.  
  731. #define JVMDI_ERROR_DUPLICATE_BREAKPOINT JVMDI_ERROR_DUPLICATE
  732. #define JVMDI_ERROR_NO_SUCH_BREAKPOINT   JVMDI_ERROR_NOT_FOUND
  733. #define JVMDI_ERROR_DUPLICATE_FRAME_POP  JVMDI_ERROR_DUPLICATE
  734.  
  735.  
  736. static JVMDI_Interface_1 *jvmdi_interface = NULL;
  737. static JavaVM *j_vm;
  738.  
  739. #ifdef __cplusplus
  740. #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)?  \
  741.               ((a_env)->GetJavaVM(&j_vm),  \
  742.                (j_vm)->GetEnv((void **)&jvmdi_interface,  \
  743.                                JVMDI_VERSION_1)):0)
  744. #else
  745. #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)?  \
  746.               ((*a_env)->GetJavaVM(a_env, &j_vm), \
  747.                (*j_vm)->GetEnv(j_vm, (void **)&jvmdi_interface, \
  748.                                JVMDI_VERSION_1)):0)
  749. #endif
  750.  
  751. #define JVMDI_SetEventHook(a_env, a1) ( \
  752.               SetJVMDIfromJNIEnv(a_env), \
  753.               jvmdi_interface->SetEventHook(a1) )
  754. #define JVMDI_GetThreadStatus(a_env, a1, a2, a3) ( \
  755.               SetJVMDIfromJNIEnv(a_env), \
  756.               jvmdi_interface->GetThreadStatus(a1, a2, a3) )
  757. #define JVMDI_GetAllThreads(a_env, a1, a2) ( \
  758.               SetJVMDIfromJNIEnv(a_env), \
  759.               jvmdi_interface->GetAllThreads(a1, a2) )
  760. #define JVMDI_SuspendThread(a_env, a1) ( \
  761.               SetJVMDIfromJNIEnv(a_env), \
  762.               jvmdi_interface->SuspendThread(a1) )
  763. #define JVMDI_ResumeThread(a_env, a1) ( \
  764.               SetJVMDIfromJNIEnv(a_env), \
  765.               jvmdi_interface->ResumeThread(a1) )
  766. #define JVMDI_StopThread(a_env, a1, a2) ( \
  767.               SetJVMDIfromJNIEnv(a_env), \
  768.               jvmdi_interface->StopThread(a1, a2) )
  769. #define JVMDI_InterruptThread(a_env, a1) ( \
  770.               SetJVMDIfromJNIEnv(a_env), \
  771.               jvmdi_interface->InterruptThread(a1) )
  772. #define JVMDI_SetSingleStep(a_env, a1, a2) ( \
  773.               SetJVMDIfromJNIEnv(a_env), \
  774.               jvmdi_interface->SetEventNotificationMode( \
  775.                                        (a2) ? JVMDI_ENABLE : JVMDI_DISABLE, \
  776.                                         JVMDI_EVENT_SINGLE_STEP, a1) )
  777. #define JVMDI_GetThreadInfo(a_env, a1, a2) ( \
  778.               SetJVMDIfromJNIEnv(a_env), \
  779.               jvmdi_interface->GetThreadInfo(a1, a2) )
  780. #define JVMDI_RunDebugThread(a_env, a1, a2, a3, a4) ( \
  781.               SetJVMDIfromJNIEnv(a_env), \
  782.               jvmdi_interface->RunDebugThread(a1, a2, a3, a4) )
  783. #define JVMDI_GetTopThreadGroups(a_env, a1, a2) ( \
  784.               SetJVMDIfromJNIEnv(a_env), \
  785.               jvmdi_interface->GetTopThreadGroups(a1, a2) )
  786. #define JVMDI_GetThreadGroupInfo(a_env, a1, a2) ( \
  787.               SetJVMDIfromJNIEnv(a_env), \
  788.               jvmdi_interface->GetThreadGroupInfo(a1, a2) )
  789. #define JVMDI_GetThreadGroupChildren(a_env, a1, a2, a3, a4, a5) ( \
  790.               SetJVMDIfromJNIEnv(a_env), \
  791.               jvmdi_interface->GetThreadGroupChildren(a1, a2, a3, a4, a5) )
  792. #define JVMDI_GetCurrentFrame(a_env, a1, a2) ( \
  793.               SetJVMDIfromJNIEnv(a_env), \
  794.               jvmdi_interface->GetCurrentFrame(a1, a2) )
  795. #define JVMDI_GetCallerFrame(a_env, a1, a2) ( \
  796.               SetJVMDIfromJNIEnv(a_env), \
  797.               jvmdi_interface->GetCallerFrame(a1, a2) )
  798. #define JVMDI_GetFrameLocation(a_env, a1, a2, a3, a4) ( \
  799.               SetJVMDIfromJNIEnv(a_env), \
  800.               jvmdi_interface->GetFrameLocation(a1, a2, a3, a4) )
  801. #define JVMDI_NotifyFramePop(a_env, a1) ( \
  802.               SetJVMDIfromJNIEnv(a_env), \
  803.               jvmdi_interface->NotifyFramePop(a1) )
  804. #define JVMDI_GetLocalObject(a_env, a1, a2, a3) ( \
  805.               SetJVMDIfromJNIEnv(a_env), \
  806.               jvmdi_interface->GetLocalObject(a1, a2, a3) )
  807. #define JVMDI_GetLocalInt(a_env, a1, a2, a3) ( \
  808.               SetJVMDIfromJNIEnv(a_env), \
  809.               jvmdi_interface->GetLocalInt(a1, a2, a3) )
  810. #define JVMDI_GetLocalLong(a_env, a1, a2, a3) ( \
  811.               SetJVMDIfromJNIEnv(a_env), \
  812.               jvmdi_interface->GetLocalLong(a1, a2, a3) )
  813. #define JVMDI_GetLocalFloat(a_env, a1, a2, a3) ( \
  814.               SetJVMDIfromJNIEnv(a_env), \
  815.               jvmdi_interface->GetLocalFloat(a1, a2, a3) )
  816. #define JVMDI_GetLocalDouble(a_env, a1, a2, a3) ( \
  817.               SetJVMDIfromJNIEnv(a_env), \
  818.               jvmdi_interface->GetLocalDouble(a1, a2, a3) )
  819. #define JVMDI_SetLocalObject(a_env, a1, a2, a3) ( \
  820.               SetJVMDIfromJNIEnv(a_env), \
  821.               jvmdi_interface->SetLocalObject(a1, a2, a3) )
  822. #define JVMDI_SetLocalInt(a_env, a1, a2, a3) ( \
  823.               SetJVMDIfromJNIEnv(a_env), \
  824.               jvmdi_interface->SetLocalInt(a1, a2, a3) )
  825. #define JVMDI_SetLocalLong(a_env, a1, a2, a3) ( \
  826.               SetJVMDIfromJNIEnv(a_env), \
  827.               jvmdi_interface->SetLocalLong(a1, a2, a3) )
  828. #define JVMDI_SetLocalFloat(a_env, a1, a2, a3) ( \
  829.               SetJVMDIfromJNIEnv(a_env), \
  830.               jvmdi_interface->SetLocalFloat(a1, a2, a3) )
  831. #define JVMDI_SetLocalDouble(a_env, a1, a2, a3) ( \
  832.               SetJVMDIfromJNIEnv(a_env), \
  833.               jvmdi_interface->SetLocalDouble(a1, a2, a3) )
  834. #define JVMDI_CreateRawMonitor(a_env, a1, a2) ( \
  835.               SetJVMDIfromJNIEnv(a_env), \
  836.               jvmdi_interface->CreateRawMonitor(a1, a2) )
  837. #define JVMDI_DestroyRawMonitor(a_env, a1) ( \
  838.               SetJVMDIfromJNIEnv(a_env), \
  839.               jvmdi_interface->DestroyRawMonitor(a1) )
  840. #define JVMDI_RawMonitorEnter(a_env, a1) ( \
  841.               SetJVMDIfromJNIEnv(a_env), \
  842.               jvmdi_interface->RawMonitorEnter(a1) )
  843. #define JVMDI_RawMonitorExit(a_env, a1) ( \
  844.               SetJVMDIfromJNIEnv(a_env), \
  845.               jvmdi_interface->RawMonitorExit(a1) )
  846. #define JVMDI_RawMonitorWait(a_env, a1, a2) ( \
  847.               SetJVMDIfromJNIEnv(a_env), \
  848.               jvmdi_interface->RawMonitorWait(a1, a2) )
  849. #define JVMDI_RawMonitorNotify(a_env, a1) ( \
  850.               SetJVMDIfromJNIEnv(a_env), \
  851.               jvmdi_interface->RawMonitorNotify(a1) )
  852. #define JVMDI_RawMonitorNotifyAll(a_env, a1) ( \
  853.               SetJVMDIfromJNIEnv(a_env), \
  854.               jvmdi_interface->RawMonitorNotifyAll(a1) )
  855. #define JVMDI_SetBreakpoint(a_env, a1, a2, a3) ( \
  856.               SetJVMDIfromJNIEnv(a_env), \
  857.               jvmdi_interface->SetBreakpoint(a1, a2, a3) )
  858. #define JVMDI_ClearBreakpoint(a_env, a1, a2, a3) ( \
  859.               SetJVMDIfromJNIEnv(a_env), \
  860.               jvmdi_interface->ClearBreakpoint(a1, a2, a3) )
  861. #define JVMDI_ClearAllBreakpoints(a_env) ( \
  862.               SetJVMDIfromJNIEnv(a_env), \
  863.               jvmdi_interface->ClearAllBreakpoints() )
  864. #define JVMDI_SetAllocationHooks(a_env, a1, a2) ( \
  865.               SetJVMDIfromJNIEnv(a_env), \
  866.               jvmdi_interface->SetAllocationHooks(a1, a2) )
  867. #define JVMDI_Allocate(a_env, a1, a2) ( \
  868.               SetJVMDIfromJNIEnv(a_env), \
  869.               jvmdi_interface->Allocate(a1, a2) )
  870. #define JVMDI_Deallocate(a_env, a1) ( \
  871.               SetJVMDIfromJNIEnv(a_env), \
  872.               jvmdi_interface->Deallocate(a1) )
  873. #define JVMDI_GetClassSignature(a_env, a1, a2) ( \
  874.               SetJVMDIfromJNIEnv(a_env), \
  875.               jvmdi_interface->GetClassSignature(a1, a2) )
  876. #define JVMDI_GetClassStatus(a_env, a1, a2) ( \
  877.               SetJVMDIfromJNIEnv(a_env), \
  878.               jvmdi_interface->GetClassStatus(a1, a2) )
  879. #define JVMDI_GetSourceFileName(a_env, a1, a2) ( \
  880.               SetJVMDIfromJNIEnv(a_env), \
  881.               jvmdi_interface->GetSourceFileName(a1, a2) )
  882. #define JVMDI_GetClassModifiers(a_env, a1, a2) ( \
  883.               SetJVMDIfromJNIEnv(a_env), \
  884.               jvmdi_interface->GetClassModifiers(a1, a2) )
  885. #define JVMDI_GetClassMethods(a_env, a1, a2, a3) ( \
  886.               SetJVMDIfromJNIEnv(a_env), \
  887.               jvmdi_interface->GetClassMethods(a1, a2, a3) )
  888. #define JVMDI_GetClassFields(a_env, a1, a2, a3) ( \
  889.               SetJVMDIfromJNIEnv(a_env), \
  890.               jvmdi_interface->GetClassFields(a1, a2, a3) )
  891. #define JVMDI_GetImplementedInterfaces(a_env, a1, a2, a3) ( \
  892.               SetJVMDIfromJNIEnv(a_env), \
  893.               jvmdi_interface->GetImplementedInterfaces(a1, a2, a3) )
  894. #define JVMDI_IsInterface(a_env, a1, a2) ( \
  895.               SetJVMDIfromJNIEnv(a_env), \
  896.               jvmdi_interface->IsInterface(a1, a2) )
  897. #define JVMDI_IsArrayClass(a_env, a1, a2) ( \
  898.               SetJVMDIfromJNIEnv(a_env), \
  899.               jvmdi_interface->IsArrayClass(a1, a2) )
  900. #define JVMDI_ClassLoader(a_env, a1, a2) ( \
  901.               SetJVMDIfromJNIEnv(a_env), \
  902.               jvmdi_interface->GetClassLoader(a1, a2) )
  903. #define JVMDI_GetFieldName(a_env, a1, a2, a3, a4) ( \
  904.               SetJVMDIfromJNIEnv(a_env), \
  905.               jvmdi_interface->GetFieldName(a1, a2, a3, a4) )
  906. #define JVMDI_GetFieldDeclaringClass(a_env, a1, a2, a3) ( \
  907.               SetJVMDIfromJNIEnv(a_env), \
  908.               jvmdi_interface->GetFieldDeclaringClass(a1, a2, a3) )
  909. #define JVMDI_GetFieldModifiers(a_env, a1, a2, a3) ( \
  910.               SetJVMDIfromJNIEnv(a_env), \
  911.               jvmdi_interface->GetFieldModifiers(a1, a2, a3) )
  912. #define JVMDI_GetMethodName(a_env, a1, a2, a3, a4) ( \
  913.               SetJVMDIfromJNIEnv(a_env), \
  914.               jvmdi_interface->GetMethodName(a1, a2, a3, a4) )
  915. #define JVMDI_GetMethodDeclaringClass(a_env, a1, a2, a3) ( \
  916.               SetJVMDIfromJNIEnv(a_env), \
  917.               jvmdi_interface->GetMethodDeclaringClass(a1, a2, a3) )
  918. #define JVMDI_GetMethodModifiers(a_env, a1, a2, a3) ( \
  919.               SetJVMDIfromJNIEnv(a_env), \
  920.               jvmdi_interface->GetMethodModifiers(a1, a2, a3) )
  921. #define JVMDI_GetMaxStack(a_env, a1, a2, a3) ( \
  922.               SetJVMDIfromJNIEnv(a_env), \
  923.               jvmdi_interface->GetMaxStack(a1, a2, a3) )
  924. #define JVMDI_GetMaxLocals(a_env, a1, a2, a3) ( \
  925.               SetJVMDIfromJNIEnv(a_env), \
  926.               jvmdi_interface->GetMaxLocals(a1, a2, a3) )
  927. #define JVMDI_GetArgumentsSize(a_env, a1, a2, a3) ( \
  928.               SetJVMDIfromJNIEnv(a_env), \
  929.               jvmdi_interface->GetArgumentsSize(a1, a2, a3) )
  930. #define JVMDI_GetLineNumberTable(a_env, a1, a2, a3, a4) ( \
  931.               SetJVMDIfromJNIEnv(a_env), \
  932.               jvmdi_interface->GetLineNumberTable(a1, a2, a3, a4) )
  933. #define JVMDI_GetMethodLocation(a_env, a1, a2, a3, a4) ( \
  934.               SetJVMDIfromJNIEnv(a_env), \
  935.               jvmdi_interface->GetMethodLocation(a1, a2, a3, a4) )
  936. #define JVMDI_GetLocalVariableTable(a_env, a1, a2, a3, a4) ( \
  937.               SetJVMDIfromJNIEnv(a_env), \
  938.               jvmdi_interface->GetLocalVariableTable(a1, a2, a3, a4) )
  939. #define JVMDI_GetExceptionHandlerTable(a_env, a1, a2, a3, a4) ( \
  940.               SetJVMDIfromJNIEnv(a_env), \
  941.               jvmdi_interface->GetExceptionHandlerTable(a1, a2, a3, a4) )
  942. #define JVMDI_GetThrownExceptions(a_env, a1, a2, a3, a4) ( \
  943.               SetJVMDIfromJNIEnv(a_env), \
  944.               jvmdi_interface->GetThrownExceptions(a1, a2, a3, a4) )
  945. #define JVMDI_GetBytecodes(a_env, a1, a2, a3, a4) ( \
  946.               SetJVMDIfromJNIEnv(a_env), \
  947.               jvmdi_interface->GetBytecodes(a1, a2, a3, a4) )
  948. #define JVMDI_IsMethodNative(a_env, a1, a2, a3) ( \
  949.               SetJVMDIfromJNIEnv(a_env), \
  950.               jvmdi_interface->IsMethodNative(a1, a2, a3) )
  951. #define JVMDI_GetLoadedClasses(a_env, a1, a2) ( \
  952.               SetJVMDIfromJNIEnv(a_env), \
  953.               jvmdi_interface->GetLoadedClasses(a1, a2) )
  954. #define JVMDI_GetClassLoaderClasses(a_env, a1, a2, a3) ( \
  955.               SetJVMDIfromJNIEnv(a_env), \
  956.               jvmdi_interface->GetClassLoaderClasses(a1, a2, a3) )
  957. #define JVMDI_GetVersionNumber(a_env, a1) ( \
  958.               SetJVMDIfromJNIEnv(a_env), \
  959.               jvmdi_interface->GetVersionNumber(a1) )
  960.  
  961. #endif /* !NO_JVMDI_MACROS */
  962.  
  963. #ifdef __cplusplus
  964. } /* extern "C" */
  965. #endif /* __cplusplus */
  966.  
  967. #endif /* !_JAVASOFT_JVMDI_H_ */
  968.  
  969.  
  970.